草庐IT

javascript oop、instanceof 和基类

全部标签

c++ - Clang 无法从基类中找到 const 模板成员函数

以下C++文件:structBase{templatevoidf(T&&)const{}};structDerived:Base{templatevoidf(T&&)const{}usingBase::f;};intmain(){Derivedconstcd;cd.f('x');}用GCC编译得很好,但用Clang编译不好:$g++-7.3.0-std=c++11test.cpp-otest-Wall-Wextra$g++-7.2.0-std=c++11test.cpp-otest-Wall-Wextra$g++-6.4.0-std=c++11test.cpp-otest-Wall-W

c++ - 在派生类到基类的转换中 move 语义

考虑以下类Buffer,它包含一个std::vector对象:#include#includeclassBuffer{std::vectorbuf_;protected:Buffer(std::byteval):buf_(1024,val){}};现在,考虑下面的函数make_zeroed_buffer()。BufferBuilder类是一个localclass公开派生自Buffer。它的目的是创建Buffer对象。Buffermake_zeroed_buffer(){structBufferBuilder:Buffer{BufferBuilder():Buffer(std::byte

C++通过继承在具有 protected 构造函数的基类堆上分配对象

我有一个带有protected构造函数的类:classB{protected:B(){};};现在我从它派生并定义了两个静态函数,我设法实际创建类B的对象,但不是在堆上:classA:publicB{public:staticBcreateOnStack(){returnB();}//staticB*createOnHeap(){returnnewB;}//CompiletimeErroronVS2010};Bb=A::createOnStack();//ThisworksonVS2010!问题是:1)VS2010允许第一种情况是错误的吗?2)是否可以在不以任何方式修改B的情况下创建B

c++ - 在 CRTP 基类的后期指定返回中使用 decltype

我正在尝试在CRTP基类中的成员函数的后期指定返回中使用decltype,它出现错误:invaliduseofincompletetypeconststructAnyOp>.templatestructOperation{templateautooperator()(constFoo&foo)const->typenamestd::enable_if::value,decltype(static_cast(nullptr)->call_with_foo(foo))>::type{returnstatic_cast(this)->call_with_foo(foo);}};templat

C++:为模板参数指定基类

我需要设计一个框架来并行计算分而治之算法的结果。为了使用该框架,用户需要以某种方式指定实现“划分”阶段(从T到T的函数)、“征服”阶段(从D到D的函数)以及T和D本身的过程。我认为定义两个抽象类会很好,BaseDivide和BaseConquer,它们声明一个纯虚方法compute正确的类型:这样我就有了一个类型,它实现了一个定义明确的概念(从框架的角度来看),并通过派生抽象类来包含用户可定义的函数。我想过使用模板将类型传递给框架,这样用户就不必为了使用框架而实例化它们,所以像这样:templateDcompute(Targ);我的问题是我希望分而治之成为BaseDivide和Base

c++ - 层次结构中的所有派生类都需要访问虚拟基类吗?

当我尝试编译以下代码时:classA{public:A(intv):virt(v){}intvirt;intgetVirt(void)const{returnvirt;}};classB:privatevirtualA{protected:B(intv):A(v){}usingA::getVirt;};classC:publicB,privatevirtualA{protected:C(intv):A(v),B(v){}usingA::getVirt;};classD:publicC{public:D(void):C(3){}usingC::getVirt;};#includeintm

基类的c++模板特化

我想要一个用于BASECLASS和所有派生类的特殊格式化程序。我有以下类(class):structBASECLASS{...};structSPECIALFORMAT:BASECLASS{...}structANOTHERSPECIALFORMAT:BASECLASS{...}templatestructLISTFORMATTER{listl;boolformat(){};}boolLISTFORMATTER::format(){...}LISTFORMATTERbcFt;LISTFORMATTERspFt;LISTFORMATTERaspFt;bcFt.format();//如何为

c++ - 使用和重载基类的模板成员函数?

在下面,structY重载了X的成员函数f。两个重载都是模板函数,但采用不同的参数(typename和int),需要明确指定:structX{templatestaticboolf(){returntrue;}};structY:publicX{usingX::f;templatestaticboolf(){returnfalse;}};intmain(){std::cout()()这会按预期使用gcc打印10。然而,clang(3.3)提示说[...]error:nomatchingfunctionforcallto'f'std::cout()()staticboolf(){retu

c++ - 指向具有 protected 继承的基类方法的指针

我有这个代码:classFoo{public:intx=4;int&operator[](size_tindex){returnx;}};classBar:protectedFoo{public:usingFoo::operator[];Bar(){x++;}};intmain(intagrc,char**argv){typedefint&(Bar::*getOp)(size_tindex);Barb;autobVal=b[4];getOpo=&Bar::operator[];autobVal2=(b.*o)(7);}但是,我不能编译它,因为errorC2247:'Foo'notacc

c++ - 基类的多重虚继承和构造函数调用

有这段代码:#includeclassBazowa{intx;public:Bazowa():x(55){}Bazowa(intx_):x(x_){}voidfun(){std::cout执行此程序后,它将打印“55fun”。类Pochodna1和Pochodna2中的构造函数调用发生了什么——它们被忽略了吗?为什么Bazowa类的成员'x'设置为'55',而不是'101'或'103'? 最佳答案 虚基构造函数总是从最终叶类中调用。没有调用虚拟基的其他构造函数。在您的情况下,SuperPochodna()正在调用Bazowa()并在